package com.gjy.learning.scala

import org.apache.spark.sql.SparkSession
import org.apache.spark.broadcast.Broadcast

object BroadcastVariableExample {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("BroadcastVariableExample")
      .master("local[*]")
      .getOrCreate()
    val sc = spark.sparkContext
    // 在Driver端创建一个可变的变量
    val mutableVar = scala.collection.mutable.Map("key" -> 0)
    println(mutableVar)
    // 将可变变量广播到各个Executor
    val broadcastVar: Broadcast[scala.collection.mutable.Map[String, Int]] = sc.broadcast(mutableVar)
    val rdd = sc.parallelize(1 to 10)
    val resultRdd = rdd.map { num =>
      // 在Executor中获取广播变量并修改其中的值
      val localMutableVar = broadcastVar.value
      localMutableVar("key") += num
      localMutableVar("key")
    }
    // 触发计算并获取结果
    val result = resultRdd.collect()
    result.foreach(println)
    // 此时广播变量中的值已经在Executor中被修改
    println("Final value of mutableVar in Driver: " + broadcastVar.value("key"))
    spark.stop()
  }
}